﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public partial class  ComparativoItem
    {
        //public List<view_ComparativoItem> getListFromEstructuraCosto(dbGestionDataContext _db,
        //    int idEstructuraCosto, decimal tipoCambio)
        //{
        //    List<view_ComparativoItem> OrdenCompraItemList = new List<view_ComparativoItem>();


        //     // aquellos que faltan despachar
          
            
        //    var q = from a in _db.EstructuraCostoItems
        //            where a.idEstructuraCosto == idEstructuraCosto &&
        //            (a.cantidad - a.cantidadUso) != 0 &&  (a.bitsel ==true)
        //            select a;

        //    foreach(EstructuraCostoItem  item in q)
        //     {
        //        // 
        //         view_ComparativoItem ordenItem = new view_ComparativoItem();
        //        //idinternal
            


        //         ordenItem.idInternal = Parametros.GenerarID();
        //         ordenItem.idEstructuraCostoItem = item.idInternal;
        //         ordenItem.descripcion = item.descripcion;
        //         ordenItem.codigo = item.codigo;
        //         ordenItem.unidad = item.unidad;
        //        ordenItem.cantidadOrig=(item.cantidad-item.cantidadUso);
        //        //para controlar cantidades entre diferentes comparativos;
        //        ordenItem.cantidadBase = (item.cantidad - item.cantidadUso);
        //        ordenItem.precioBase = Math.Round(item.precio.Value * tipoCambio, 2);
        //        ordenItem.totalBase = Math.Round(((item.total - item.totalUso).Value * tipoCambio),2);
                
        //        //igual al total esto es para realizar la comparacion;
        //        ordenItem.totalComparar = Math.Round(((item.total - item.totalUso).Value * tipoCambio), 2);

        //        ordenItem.tipoCambio = tipoCambio;
        //        ordenItem.bitSel = true;
        //        ordenItem.idPadre = 0;
        //        ordenItem.nivel = 0;
                
        //        ordenItem.precio1 = 0;
        //        ordenItem.precio2 = 0;
        //        ordenItem.precio3 = 0;
        //        ordenItem.total1 = 0;
        //        ordenItem.total2 = 0;
        //        ordenItem.total3 = 0;

        //        OrdenCompraItemList.Add(ordenItem);
        //    }


        //    return OrdenCompraItemList;
        //}

        public decimal getMontoUsoTotal(dbGestionDataContext _db,
           int idComparativoItem)
        {
            decimal result = 0;

            var q = from i in _db.ComparativoItemSelecPrv
                     where i.idComparativoItem == idComparativoItem 
                     select i;

          if (q.Count()>0)
          {
                    result = q.Sum(p => (p.totalUso)).Value;
          }

         
            return Math.Round(result, 4);
        }

        public decimal getCantidadUsoTotal(dbGestionDataContext _db,
            int idComparativoItem)
        {
            decimal result = 0;

            var q = from i in _db.ComparativoItemSelecPrv
                    where i.idComparativoItem == idComparativoItem
                     select i;

            if (q.Count() > 0)
            {
                result = q.Sum(p => p.cantidadUso).Value;
            }
           


            return result;
        }


        //public List<view_comparativoItemAddProv> getListPendiente(dbGestionDataContext _db, int idComparativo)
        //{
        //    List<view_comparativoItemAddProv> list = new List<view_comparativoItemAddProv>();

        //    var q = from a in _db.view_comparativoItemAddProv
        //           where a.idComparativo==idComparativo 
        //           select a;

        //    if (q.Count()>0)
        //    {
        //        list= q.ToList();

        //    }

        //    return list;
        
        
        //}


        public void updateTotalesUso(dbGestionDataContext _db)
        {
            this.cantUso=this.getCantidadUsoTotal(_db, this.idInternal);
            this.totalUso = this.getMontoUsoTotal(_db, this.idInternal);
            _db.SubmitChanges();

            
            
        }
        public bool addItem(dbGestionDataContext _db,
                                            int idComparativo,
                                            int? idEstructuraCostoItem,
                                            bool bitControlCant,
                                            string codigo,
                                            string descripcion,
                                            string unidad,
                                            int nivel,
                                            int? idPadre,
                                            decimal cantidadBase,
                                            decimal precioBase,
                                            decimal cantidadOrigen,
                                            decimal totalOrigen,
                                            decimal tipoCambioOrig,
                                            decimal totalBase,
                                            int idMonedaComparativo,
                                            decimal precio1,
                                            decimal total1,
                                            decimal precio2,
                                            decimal total2,
                                            decimal precio3,
                                            decimal total3,
                                            bool bitSelec,
                                            decimal tipoCambio,
                                            int idAudit)
                                    {


                                        this.idComparativo = idComparativo;
                                        this.idEstructuraCostoItem = idEstructuraCostoItem;
                                        this._bitControlCant = bitControlCant;
                                        this.cantidadBase = cantidadBase;
                                        this.precioBase = precioBase;
                                        this.idMonedaBase = idMonedaComparativo;
                                        this.precio1 = precio1;
                                        this.total1 = total1;
                                        this.precio2 = precio2;
                                        this.total2 = total2;
                                        this.precio3 = precio3;
                                        this.total3 = total3;
                                        this.nivel = nivel;
                                        this.bitSel = bitSelec;
                                        this.codigo = codigo;
                                        this.descripcion = descripcion;
                                        this.unidad = unidad;
                                        this.tipoCambio = tipoCambio;
                                        this.idPadre = idPadre;
                                        this.totalBase =totalBase;
                                        this.totalCantidadOrig = cantidadOrigen;
                                        this.totalBaseOrigen = totalOrigen;
                                        this.tipoCambioOrig = tipoCambioOrig;
                                        this.cantUso = 0;
                                        this.totalUso = 0;
                                        this.totalMonedaBase = 0;
                                        this.bitFinalizado = false;
                                        _db.ComparativoItems.InsertOnSubmit(this);
                                        
                                         // auditoria antes de guardar

                                        AuditRecord auditRecord = _db.AuditRecord.Single(p => p.Id == idAudit);
                                        auditRecord.update(_db, this,AuditAction.Insert);

                                        _db.SubmitChanges();
                                        return true;

        }



        public bool updateItem(dbGestionDataContext _db,
                                           bool bitControlCant,
                                           decimal cantidadBase,
                                           decimal precioBase,
                                            decimal cantidadOrigen,
                                            decimal totalOrigen,
                                           decimal totalBase,
                                           int idMonedaComparativo,
                                           decimal precio1,
                                           decimal total1,
                                           decimal precio2,
                                           decimal total2,
                                           decimal precio3,
                                           decimal total3,
                                           decimal tipoCambio,
                                            int idAudit
                                            
                                       )
        {

            if (this.cantUso > 0)
            {
                throw new Exception(String.Format("El item {0} se encutentra en uso",this.descripcion));
            
            }

            
            this.bitControlCant = bitControlCant;
            this.cantidadBase = cantidadBase;
            this.precioBase = precioBase;
            //update total origen: para caso de editar actualiza saldos origenes
            this.totalCantidadOrig = cantidadOrigen;
            this.totalBaseOrigen = totalOrigen;
            //
            this.idMonedaBase = idMonedaComparativo;
            this.precio1 = precio1;
            this.total1 = total1;
            this.precio2 = precio2;
            this.total2 = total2;
            this.precio3 = precio3;
            this.total3 = total3;
            this.tipoCambio = tipoCambio;
            this.totalBase = totalBase;

            // auditoria antes de guardar UPDATE

            AuditRecord auditRecord = _db.AuditRecord.Single(p => p.Id == idAudit);
            auditRecord.update(_db, this,AuditAction.Update);

            
            _db.SubmitChanges();
            return true;

        }


        public void deleteItem(dbGestionDataContext _db,int idAudit)
        {
            //verificamos   que no se  encuentre utilizado


            // ELIMINAMOS LOS REGISTROS DE itemproveedorSeleccion
            var pis = from a in _db.ComparativoItemSelecPrv
                      where a.idComparativoItem == this.idInternal
                      select a;

            //sin uso entonces se elimna
            foreach (var a in pis)
            {
                if (a.totalUso > 0)
                {
                    throw new Exception("no puede Eliminar por estar en uso en la Orden de Compra");
                }

                _db.ComparativoItemSelecPrv.DeleteOnSubmit(a);
            }



            _db.ComparativoItems.DeleteOnSubmit(this);

            // auditoria antes de guardar

            AuditRecord auditRecord = _db.AuditRecord.Single(p => p.Id == idAudit);
            auditRecord.update(_db, this,AuditAction.Delete);
   
            _db.SubmitChanges();
        }



          


       
       
    }
}
